package cn.virens.common.mybatis.entity.param;

import cn.virens.common.util.exception.APIException;
import org.dromara.hutool.core.array.ArrayUtil;
import org.dromara.hutool.core.collection.CollUtil;
import org.dromara.hutool.core.map.MapUtil;
import org.dromara.hutool.core.text.split.SplitUtil;

import java.util.Arrays;
import java.util.Collection;
import java.util.Map;

public class PageParamUtil {
    /**
     * 获取 = 匹配参数值
     *
     * @param param 参数集
     * @param key   参数名称
     * @return 参数值
     */
    public static Object criteriaEqual(Map<String, Object> param, String key) {
        return PageParamUtil.criteriaEqual(param, key, null);
    }

    /**
     * 获取 = 匹配参数值
     *
     * @param param 参数集
     * @param key   参数名称
     * @param def   默认值
     * @return 参数值
     */
    public static Object criteriaEqual(Map<String, Object> param, String key, Object def) {
        return param == null || !param.containsKey(key) ? def : param.get(key);
    }

    /**
     * 获取 LIKE 匹配参数值
     *
     * @param param 参数集
     * @param key   参数名称
     * @return 参数值
     */
    public static String criteriaLike(Map<String, Object> param, String key) {
        return PageParamUtil.criteriaLike(param, key, null);
    }

    /**
     * 获取 LIKE 匹配参数值
     *
     * @param param 参数集
     * @param key   参数名称
     * @param def   默认值
     * @return 参数值
     */
    public static String criteriaLike(Map<String, Object> param, String key, String def) {
        Object val = PageParamUtil.criteriaEqual(param, key, def);

        if (val != null && !"".equals(val)) {
            return "%" + val + "%";
        } else {
            return null;
        }
    }

    /**
     * 获取 LIKE 匹配参数值(START)
     *
     * @param param 参数集
     * @param key   参数名称
     * @return 参数值
     */
    public static String criteriaStart(Map<String, Object> param, String key) {
        return criteriaStart(param, key, null);
    }

    /**
     * 获取 LIKE 匹配参数值(START)
     *
     * @param param 参数集
     * @param key   参数名称
     * @param def   默认值
     * @return 参数值
     */
    public static String criteriaStart(Map<String, Object> param, String key, String def) {
        Object val = PageParamUtil.criteriaEqual(param, key, def);

        if (val != null && !"".equals(val)) {
            return val + "%";
        } else {
            return null;
        }
    }

    /**
     * 获取 LIKE 匹配参数值(END)
     *
     * @param param 参数集
     * @param key   参数名称
     * @return 参数值
     */
    public static String criteriaEnd(Map<String, Object> param, String key) {
        return criteriaEnd(param, key, null);
    }

    /**
     * 获取 LIKE 匹配参数值(END)
     *
     * @param param 参数集
     * @param key   参数名称
     * @param def   默认值
     * @return 参数值
     */
    public static String criteriaEnd(Map<String, Object> param, String key, String def) {
        Object val = PageParamUtil.criteriaEqual(param, key, def);

        if (val != null && !"".equals(val)) {
            return "%" + val;
        } else {
            return null;
        }
    }

    /**
     * 获取 IN 匹配参数值
     *
     * @param param 参数集
     * @param key   参数名称
     * @return 参数值
     */
    public static Iterable<Object> criteriaIn(Map<String, Object> param, String key) {
        return PageParamUtil.criteriaIn(param, key, null);
    }

    /**
     * 获取 IN 匹配参数值
     *
     * @param param 参数集
     * @param key   参数名称
     * @param def   默认值
     * @return 参数值
     */
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static Iterable<Object> criteriaIn(Map<String, Object> param, String key, Object def) {
        Object val = PageParamUtil.criteriaEqual(param, key, def);

        if (val != null && ArrayUtil.isArray(val)) {
            return n(Arrays.asList((Object[]) val));
        } else if (val instanceof Collection) {
            return n((Collection<Object>) val);
        } else if (val instanceof String str) {
            return n(SplitUtil.split(str, ","));
        } else if (val instanceof Map) {
            return n(((Map) val).values());
        } else if (val != null) {
            return n(Arrays.asList(val));
        } else {
            return null;
        }
    }

    /**
     * 获取结束时间(后面填充23:59:59)
     *
     * @param param 参数集
     * @param key   参数名称
     * @param def   默认值
     */
    public static Object criteriaEtime(Map<String, Object> param, String key, Object def) throws APIException {
        String time = MapUtil.getStr(param, key);
        if (time != null && !time.isEmpty()) {
            return time + " 23:59:59";
        }

        return def;
    }

    /**
     * 获取开始时间(后面填充00:00:00)
     *
     * @param param 参数集
     * @param key   参数名称
     * @param def   默认值
     */
    public static Object criteriaStime(Map<String, Object> param, String key, Object def) throws APIException {
        String time = MapUtil.getStr(param, key);
        if (time != null && !time.isEmpty()) {
            return time + " 00:00:00";
        }

        return def;
    }

    private static Iterable<Object> n(Iterable answer) {
        return CollUtil.isNotEmpty(answer) ? answer : null;
    }
}
